package com.atguigu.daijia.map.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.daijia.common.execption.GuiguException;
import com.atguigu.daijia.common.result.ResultCodeEnum;
import com.atguigu.daijia.map.service.MapService;
import com.atguigu.daijia.model.form.map.CalculateDrivingLineForm;
import com.atguigu.daijia.model.vo.map.DrivingLineVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
@RequiredArgsConstructor
public class MapServiceImpl implements MapService {

    private final RestTemplate restTemplate;

    @Value("${tencent.map.key}")
    private String key;

    /**
     * 计算驾驶路线
     * @param calculateDrivingLineForm
     * @return
     */
    @Override
    public DrivingLineVo calculateDrivingLine(CalculateDrivingLineForm calculateDrivingLineForm) {
        // 参考文档：https://lbs.qq.com/service/webService/webServiceGuide/route/webServiceRoute
        // https://apis.map.qq.com/ws/direction/v1/driving/?from=39.915285,116.403857&to=39.915285,116.803857&waypoints=39.111,116.112;39.112,116.113&output=json&callback=cb&key=[你的key]
        // from、to、key 是必填参数
        String url = "http://apis.map.qq.com/ws/direction/v1/driving/?from={from}&to={to}&key={key}";

        HashMap<String, String> map = new HashMap<>();
        // 起止点坐标，纬度在前，经度在后，半角逗号分隔
        map.put("from", calculateDrivingLineForm.getStartPointLatitude() + "," + calculateDrivingLineForm.getStartPointLongitude());
        map.put("to", calculateDrivingLineForm.getEndPointLatitude() + "," + calculateDrivingLineForm.getEndPointLongitude());
        map.put("key", key);

        // 远程调用腾讯位置服务的接口，可以使用 RestTemplate 或 HttpClient
        // RestTemplate 是 RestTemplate 是 Spring 提供的一个简化 HTTP 请求的工具类，主要用于与 RESTful 服务进行交互
        // HttpClient 是 Apache HttpComponents 项目提供的一个 HTTP 客户端库，用于发送和接收 HTTP 请求
        // 使用 RestTemplate 发起 GET 请求到指定 URL，并将响应结果转换为 JSONObject 类型
        JSONObject result = restTemplate.getForObject(url, JSONObject.class, map);
        if (result == null || result.getIntValue("status") != 0) {
            throw new GuiguException(ResultCodeEnum.MAP_FAIL);
        }

        // 根据参考文档，解析响应结果，注意区分自定义的变量 result 和 result.getJSONObject("result")
        // 获取响应结果中的第一种路线方案
        JSONObject route = result.getJSONObject("result").getJSONArray("routes").getJSONObject(0);

        DrivingLineVo drivingLineVo = new DrivingLineVo();
        // 路线总距离，单位：千米，保留小数点后两位，四舍五入
        drivingLineVo.setDistance(route.getBigDecimal("distance").divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_UP));
        // 路线估算时间（结合路况），单位：分钟
        drivingLineVo.setDuration(route.getBigDecimal("duration"));
        // 方案路线坐标点串
        drivingLineVo.setPolyline(route.getJSONArray("polyline"));

        return drivingLineVo;
    }
}
